package mybatis.interfaces;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModelProperty;

import java.io.Serializable;
import java.util.*;

/**
 * 过滤需要返回的字段
 *
 * @author CKC
 */
public interface IFieldQueryCondition extends Serializable {

    /**
     * 需要返回的字段，可过滤嵌套的字段，eg：fields[users]=id,name 表示 仅返回用户对象的id,name
     * 备注：为了与SwaggerUI结合，产生Swagger文档
     *
     * @return null
     */
    @ApiModelProperty(name = "fields[?]", value = "需要返回的字段，可过滤嵌套的字段，eg：fields[users]=id,name 表示 仅返回用户对象的id,name")
    @JsonIgnore
    default String getFieldsSwaggerView() {
        return null;
    }

    /**
     * getFields
     *
     * @see #getFieldsSwaggerView()
     */
    Map<String, List<String>> getFields();


    /**
     * setFields
     *
     * @param fields
     * @see #getFieldsSwaggerView
     */
    void setFields(Map<String, List<String>> fields);

    /**
     * getFieldsByType
     *
     * @param entityType 实体类型，通常为实体类型的一个别名
     */
    @ApiModelProperty(hidden = true)
    @JsonIgnore
    default List<String> getFields(String entityType) {
        if (getFields() != null) {
            return getFields().get(entityType);
        } else {
            return null;
        }
    }

    /**
     * addField
     *
     * @param entityType 实体类型，通常为实体类型的一个别名
     * @param fields     实体的属性名
     * @see #getFieldsSwaggerView
     */
    default void addField(String entityType, String... fields) {
        if (getFields() == null) {
            setFields(new HashMap<>(8));
        }
        if (getFields().get(entityType) == null) {
            getFields().put(entityType, new ArrayList<>(Arrays.asList(fields)));
        } else {
            getFields().get(entityType).addAll(Arrays.asList(fields));
        }
    }

    /**
     * setFields(null)
     *
     * @see #getFieldsSwaggerView
     */
    default void clearFields() {
        setFields(null);
    }

    /**
     * removeByField
     *
     * @param entityType 实体类型，通常为实体类型的一个别名
     * @see #getFieldsSwaggerView
     */
    default void clearTypeFields(String entityType) {
        if (getFields() == null) {
            return;
        }
        getFields().remove(entityType);
    }

    /**
     * isEmptyFields
     *
     * @return
     */
    @ApiModelProperty(hidden = true)
    @JsonIgnore
    default boolean isEmptyFields() {
        return getFields() == null || getFields().isEmpty();
    }
}
